Skip to content

第七章 RAG根基:深度学习与 Transformer 剖析

1. 章节导入:为什么要学习 Transformer 与 RAG 原理

当今的Transformer 模型架构已经成为自然语言处理领域的基石。2017年,Vaswani 等人在划时代论文《Attention Is All You Need》中引入了 Transformer 架构,标志着NLP发展的一个分水岭 。相较于早期的循环神经网络(RNN)模型,Transformer 通过自注意力机制克服了 RNN 在长程依赖和顺序处理方面的局限(如难以捕获长距离信息、训练效率低以及梯度消失问题) 。Transformer 的出现彻底改变了 NLP 模型的设计思路,并为现代大规模语言模型奠定了基础 。

与此同时,随着大模型应用的扩展,我们也面临新的挑战:模型的知识范围和时效性。大语言模型(LLM)训练后参数固化,无法及时获得新知识,且可能会生成貌似自信却与事实不符的内容(所谓“幻觉”现象)。RAG(Retrieval-Augmented Generation,检索增强生成)****框架正是在此背景下提出,用于将传统信息检索能力融入生成式模型。通过让模型在生成回答之前检索外部知识库中的权威信息,RAG 能够 增强模型的知识面和可靠性 。简单来说,RAG 就是把****搜索引擎的查找功能和生成模型的语言能力结合起来,让模型在回答问题时先“查资料”,再基于资料生成答案。这对于需要最新信息或专业知识的任务尤为重要,也是目前大模型应用的热门方案。

本章中,我们将深入剖析 Transformer 的核心原理,以及 RAG 框架的工作机制。这些原理是理解大模型工作原理性能优势的根基。掌握它们有助于开发者更高效地运用大模型,并为下一步学习更高级的模型应用打下基础。

2. 机器学习基础:监督学习、损失函数、优化

在深入模型原理之前,先回顾一些机器学习基础概念:

  • 监督学习:这是最常见的机器学习范式,即通过给模型提供带标签的数据来进行训练。每个训练样本包含输入和期望的输出,模型试图学到从输入到输出的映射关系。例如,用房屋的特征预测房价,先有大量已知房价的房屋数据来训练模型。监督学习的目标是使模型在看过足够多的样本后,可以对新输入给出准确的预测
  • 损失函数:损失函数(Loss Function)用来度量模型预测结果与真实标签之间的差异。它是一个定义模型误差的指标,指导模型的优化方向。常见损失函数如均方误差(MSE,用于回归问题,计算预测值与真实值差的平方)和交叉熵损失(用于分类问题,衡量预测概率分布与真实分布的差异)。直观来说,损失值越小代表模型预测越接近真实。训练过程中,我们希望通过最小化损失函数来提高模型性能。
  • 优化算法:为了最小化损失函数,我们需要调整模型的参数(权重)。优化算法定义了参数更新的规则。最经典的优化方法是梯度下降法(Gradient Descent):计算损失对每个参数的导数(梯度),然后沿着梯度降低的方向调整参数值,从而逐步减少损失。现代深度学习中常用的是各种改进的梯度下降优化器,如 SGD(随机梯度下降)、Adam 等。这些优化算法通过控制学习率、自适应调整不同参数的步长等策略,加速收敛并提高稳定性。

以上概念构成了深度学习模型训练的基础:利用带标签数据计算损失,通过优化算法调整参数,不断迭代直到模型在训练数据上误差尽可能小,并期望在新数据上也有良好表现(即泛化能力良好)。

3. 神经网络发展历程:从 MLP 到 RNN

要理解 Transformer 的诞生,有必要回顾一下神经网络模型的发展脉络:

(1)多层感知机(MLP)阶段: 最早的神经网络模型是感知机和多层感知机,也称为前馈神经网络。MLP 由输入层、一个或多个隐藏层和输出层的神经元连接组成,信息从输入层经隐藏层传到输出层。每层神经元与下一层全部神经元相连(全连接层),通过加权求和和非线性激活函数进行信号变换。MLP 可以近似任意函数,是通用的函数近似器,在诸如图像分类(将图像像素作为输入)等固定维度输入的问题上取得了一定成功。然而,MLP 无法有效处理序列数据(如自然语言句子或时间序列),因为它的输入长度固定,且缺乏对输入中顺序信息的建模能力。

(2)循环神经网络(RNN)阶段: 为了处理序列数据,循环神经网络应运而生。RNN 引入了隐藏状态的概念,通过隐藏状态在序列步骤之间的循环连接,让网络能够记忆之前输入的信息。具体来说,RNN 在处理序列中的第$t$个元素时,会将前一步的隐藏状态和当前输入一起用于计算新的隐藏状态,从而实现信息的递归传递。这使RNN可以处理可变长的输入,并在一定程度上捕获序列的上下文关系。例如,RNN 可以逐词读取句子并将上下文压缩到隐藏状态,再用于词语的下一步预测。在语言模型、机器翻译等任务上,RNN 一度成为主流。然而,RNN 存在显著缺陷:一是长期依赖问题,随着序列长度增长,早期信息对后面影响逐渐衰减,模型难以学习到长距离依赖关系;二是梯度消失或爆炸,在反向传播穿过长序列时,梯度容易衰减为0或发散为无穷,导致训练困难 。虽然高级变种如 LSTM(长短期记忆网络)和 GRU(门控循环单元)通过引入门控机制部分缓解了这些问题,但RNN本质的顺序计算特性仍然限制了并行化效率——序列数据只能逐步处理,无法像CNN那样同时处理多个元素。这在需要利用海量数据训练超大模型时成为瓶颈。

小结: 从 MLP 到 RNN,神经网络逐渐掌握了处理复杂数据的能力,但仍未完全解决长距离依赖和高效并行计算的问题。Transformer 正是在这样的背景下诞生的:它提供了一种全新的网络结构,能够并行地建模序列全局依赖,彻底克服了 RNN 的诸多限制 。下面我们将深入了解 Transformer 的核心机制。

4. Transformer 核心概念:自注意力、多头注意力、残差连接

Transformer 能取得成功,离不开几项关键的结构设计和机制。下面依次介绍 自注意力多头注意力残差连接 这几个核心概念:

  • 自注意力机制 (Self-Attention):自注意力是 Transformer 的基础机制。它让模型在处理当前元素时,可以参考同一序列中的其他元素来更新表示。举例来说,在翻译一句话时,翻译某个单词可能需要考虑句子中另一位置的单词,自注意力机制正是用于计算这种依赖关系的权重。在实现上,每个输入向量通过三个不同的线性变换生成“查询” (Query)、 “键” (Key) 和 “值” (Value) 向量,然后对于序列中的每个元素,用该元素的 Query 与所有元素的 Key 计算相似度(例如点积),得到对每个元素的注意力分数,再对这些分数做归一化(如通过 softmax 得到注意力权重)。最后,用这些权重对对应的 Value 向量加权求和,得到该元素在融合全局信息后的新表示。自注意力的效果是:每个元素的表示都根据整个序列与其相关的内容进行了调整。这样模型能灵活地建模长程依赖,而且由于对每个元素的注意力计算是并行进行的,不像 RNN 那样必须按顺序处理,因此计算效率更高。
  • 多头注意力 (Multi-Head Attention):单一的自注意力机制已经非常强大,但 Transformer 进一步引入了多头注意力来提升模型的表达能力。所谓“多头”,就是并行使用多个独立的自注意力模块(称为注意力头)。每个注意力头在不同的投影子空间中学习注意力:即对输入向量先通过不同的线性变换得到多组不同的 Q/K/V,然后各自计算注意力。这样,不同头可以关注序列中不同类型的关系或特征模式(例如一句话中既有语法依存关系,也有语义关联,不同头可能分别捕捉这些信息)。最后,将各个头的输出(加权和值)拼接起来,再经过一次线性变换,得到融合多方面信息的最终输出表示。多头注意力使模型能够同时从多个角度理解序列,大大提升了表示的丰富性 。
  • 残差连接 (Residual Connection):残差连接是一种跨层连接策略,最初在深度残差网络(ResNet)中提出,用于缓解深层网络训练困难的问题。在 Transformer 中,残差连接被用于每个子层(如注意力子层和前馈子层)输出与其输入之间:即令子层的输出加上未经变换的输入(残差),再经过层归一化 (Layer Normalization) 得到子层的最终输出 。残差连接的作用是让信息能够在深层网络中短路传播,避免有用的低层特征在层层传递中被破坏或消失。此外,它有助于缓解梯度消失,使得非常深的 Transformer 网络也能稳定训练 。简单来说,每一层都学习增量变化,而不是完全替换前一层的特征。这种设计使 Transformer 可以堆叠起几十甚至上百层而仍保持良好的梯度传播和表现。

以上三点构成了 Transformer 模型的核心“骨架”。值得一提的是,Transformer 中还使用了位置编码 (Positional Encoding)****来解决序列顺序信息的注入问题 。因为自注意力机制本身不区分元素的位置,为了让模型知道输入序列中各元素的相对次序,Transformer 在输入向量中加入了位置编码(例如使用正弦和余弦函数生成的位置向量)作为附加信息。这样模型便能****同时拥有位置感知能力和并行处理能力,不像 RNN 需要按序处理。

下面通过一个示意图来理解自注意力机制如何更新序列中一个单词的表示(单头注意力的情况)。假设有三个单词 Token1、Token2、Token3,计算 Token1 在自注意力作用后的新表示:

mermaid
flowchart LR
    subgraph "Self-Attention(单头示意)"
        Token1["Token1 表示"] --> Q1["Query1 (Q1)"]
        Token1 --> K1["Key1 (K1)"]
        Token1 --> V1["Value1 (V1)"]
        Token2["Token2 表示"] --> K2["Key2 (K2)"]
        Token2 --> V2["Value2 (V2)"]
        Token3["Token3 表示"] --> K3["Key3 (K3)"]
        Token3 --> V3["Value3 (V3)"]
        Q1 --> comp[计算 Q1 与所有 K 的相似度\n得到注意力分数]
        comp --> w1["对Token1的权重 w1"]
        comp --> w2["对Token2的权重 w2"]
        comp --> w3["对Token3的权重 w3"]
        w1 --> val1["w1 × V1 (加权值)"]
        w2 --> val2["w2 × V2"]
        w3 --> val3["w3 × V3"]
        val1 --> sum[加权求和]
        val2 --> sum
        val3 --> sum
        sum --> Out1["Token1 更新表示"]
    end

如上图所示:首先每个输入词向量通过线性变换得到对应的查询Q、键K、值V;然后使用 Token1 的 Q 同三个 K 分别计算相似度,得到对 Token1、Token2、Token3 的注意力得分,并取 softmax 归一化为权重 $w_1, w_2, w_3$;接着用这些权重加权相应的 V 向量并求和,得到 Token1 在考虑其他词信息后的新表示。Transformer 中所有词都同时执行上述计算,从而实现并行高效的序列信息融合。

5. Transformer 编码器-解码器结构解析

Transformer 原论文提出的架构是一个编码器-解码器(Encoder-Decoder)****模型 。这是一种典型的序列到序列 (Seq2Seq) 模型结构,常用于例如机器翻译这类输入输出皆为序列的任务。Transformer 的编码器-解码器结构包含****两个主要模块:堆叠的编码器层和堆叠的解码器层。下面我们分别解析:

编码器(Encoder): 编码器接收输入序列(例如一个英文句子)的表示,通过一系列 Transformer 编码层将其逐步转换为更抽象的表示。在每一层中,编码器首先通过多头自注意力子层让序列中的元素相互“交流”信息,然后经过前馈网络子层对每个位置的表示进行非线性变换。每个子层都有残差连接和层归一化,确保稳定训练。编码器的自注意力是完全集全序列的:即每个位置可以关注序列中任何其他位置(输入序列通常会加上特殊的起止标记用于界定范围)。经过 $N$ 层(原始 Transformer 中 $N=6$)的堆叠,编码器输出与输入序列长度相同的编码表示序列,只是每个位置的向量已经融入了该位置与其他位置的关系信息。这些编码表示可以看作是输入序列在高维语义空间的表示,将被供给解码器使用。

解码器(Decoder): 解码器从编码器输出和自身已生成的内容来产生目标序列(例如翻译后的中文句子)。解码过程是自回归的,即一次生成一个词。Transformer 解码器由类似的 $N$ 层组成,每层包括三个子层:首先一个多头自注意力子层,但这里自注意力在解码器的输出序列(已生成部分)上计算,而且为了保证因果性,需要对未来词进行遮掩(Mask)(即只允许注意到已生成的位置,防止看见“未来”的词);第二个子层是编码器-解码器注意力(有时称“交叉注意力”),它使用解码器当前层的表示作为查询,编码器的输出作为键和值,来从编码器输出中提取与当前生成位置相关的上下文信息;第三个子层是前馈网络,独立地转换每个位置的表示。每个子层同样有残差连接和层归一化。通过这种结构,解码器能够在每一步生成一个词:利用前面已生成的部分(通过自注意力,且masked确保不看未来词)、参考输入序列的编码表示(通过编码器-解码器注意力获取翻译上下文),逐步地把句子生成出来。

下图展示了 Transformer 的编码器-解码器结构中单层的组成(实际模型中编码器和解码器各堆叠多层)及信息流动:

mermaid
flowchart TB
    subgraph 编码器
        enc_in["输入序列"] --> enc_self_attn["多头自注意力"]
        enc_self_attn --> enc_addnorm1["残差 + Norm"]
        enc_addnorm1 --> enc_ffn["前馈网络"]
        enc_ffn --> enc_addnorm2["残差 + Norm"]
        enc_addnorm2 --> enc_out["编码器输出"]
    end
    subgraph 解码器
        dec_in["输出序列(已生成部分)"] --> dec_self_attn["自注意力(有掩码)"]
        dec_self_attn --> dec_addnorm1["残差 + Norm"]
        dec_addnorm1 --> dec_enc_attn["编码器-解码器注意力"]
        dec_enc_attn --> dec_addnorm2["残差 + Norm"]
        dec_addnorm2 --> dec_ffn["前馈网络"]
        dec_ffn --> dec_addnorm3["残差 + Norm"]
        dec_addnorm3 --> dec_out["解码器输出"]
    end
    enc_out -.-> dec_enc_attn

如上图所示,编码器层包含多头自注意力 -> 残差归一化 -> 前馈网络 -> 残差归一化的结构,解码器层则在自身自注意力和前馈网络之间多了一个编码器-解码器注意力子层,用来融合来自编码器输出的上下文信息。值得注意的是,解码器的自注意力带有掩码,确保每个位置只能关注到该位置之前的输出,避免利用未来的信息(这对于顺序生成非常重要)。实际模型中,编码器和解码器各有 $N$ 层这样的结构重复堆叠。比如原始 Transformer 设置 $N=6$,即6个编码器层和6个解码器层叠加。模型的工作流程是:先将输入序列喂入编码器获得编码表示,然后解码器以起始符为初始输入,不断生成词语,在每一步将编码器输出作为参考,通过多层计算最终输出下一个词,直到生成终止符为止。

Transformer 编码器-解码器架构凭借上述设计,实现了高并行度(编码器所有位置可并行处理、自注意力并行计算)和全局依赖建模(任何两个词都有直接信息通路)。在机器翻译等任务上,Transformer 显著优于以往的 RNN Seq2Seq 模型,不仅精度更高而且训练推理速度更快。这也是为什么 Transformer 会被迅速采用为各种 NLP 任务的新基础架构。

6. Transformer 家族简介:BERT、GPT、DeepSeek

自 Transformer 问世以来,研究者基于其架构衍生出了一系列大模型家族。本节简要介绍其中几种具有代表性的模型:BERT、GPT 系列,以及近年出现的 DeepSeek 模型。

  • BERT(双向编码表示Transformer) BERT 由谷歌在 2018 年提出 。它是基于 Transformer 编码器的预训练语言模型,特点是双向理解句子上下文。与只能从一个方向处理文本的传统语言模型不同,BERT 在预训练时通过掩码语言模型 (Masked LM)让模型同时考虑左侧和右侧的上下文来预测被遮蔽的单词,以及通过下一句预测任务学习句间关系 。这种双向预训练使 BERT 对文本的理解更加深入全面。在微调到下游任务时,BERT 展现出极强的迁移能力,在广泛的NLP任务(如问答、分类、命名实体识别等)上取得了当时的最佳性能 。BERT-base 模型有约1.1亿参数,BERT-large 达到3.4亿参数 。它的成功证明了预训练+微调范式的威力,揭开了大规模预训练模型时代的序幕。
  • GPT(生成式预训练Transformer) GPT 系列由 OpenAI 推出,采用的是 Transformer 的解码器架构。GPT 的目标是生成下一个词(即自回归语言模型),擅长文本生成。GPT-1 于2018年发布,是首个GPT模型,已经是一个大型 Transformer 模型,通过在海量文本上预测下一个单词进行预训练,然后在特定任务上微调 。GPT-2 (2019) 将参数规模扩大到15亿 (是 GPT-1 的约10倍),展现出惊人的零样本能力:即使不针对某任务专门微调,也能直接利用预训练表现出色,例如生成长段落文章、回答常识性问题等 。GPT-3 (2020) 更是将规模提升两个数量级,达到惊人的 1750 亿 参数 。GPT-3 展现了强大的Few-Shot和Zero-Shot学习能力,只需在提示中给出很少的示例甚至不提供示例,就能在各种任务上产生接近人类水准的结果 。这表明模型规模的巨大提升带来了质的飞跃 。GPT 系列模型推动了生成式AI的热潮,也催生出了像 ChatGPT 这样的对话式应用。总之,GPT 家族证明了Transformer 解码器架构在语言生成上的威力:随着参数和数据的扩展,模型可以生成愈发连贯、有信息含量的文本。
  • DeepSeek 系列 DeepSeek-R1 是我国在 2025 年初推出的一款开创性的开源大模型 。与BERT和GPT主要关注提高模型性能不同,DeepSeek 更强调成本效率可用性。据报道,DeepSeek-R1 采用了混合专家 (MoE)架构和其他优化,使其推理运行成本降低最多达50倍(相较于同等性能的其它大型模型) 。这一极高的性价比使得企业和开发者可以更低成本地部署和使用大模型技术。此外,DeepSeek-R1 选择了开源发布,这加速了尖端AI的普及,让各行业的创新者都能使用和改进该模型 。在能力上,DeepSeek-R1 及其变体通过结合规则强化学习等方法加强了推理和对齐能力 。简单来说,DeepSeek 系列的出现代表了大模型演进的另一个方向:在保证模型强大的同时,大幅降低使用门槛。这既满足了实际应用对成本的敏感需求,也体现了社区对于开放和可控AI的追求。

小结: Transformer 家族模型在近几年百花齐放:BERT 探索了双向编码的语义理解,GPT 系列引领了大规模生成模型的浪潮,而 DeepSeek 等新秀则专注于效率和开放性。它们都建立在 Transformer 架构之上,又各有侧重。这些模型的迭代展示了大模型的演进路线:无论是增加参数规模以追求性能极限,还是改进架构以提升效率和可用性,Transformer 架构的灵活性都为创新提供了坚实基础。

7. 模型训练的基本流程与挑战

构建一个深度学习模型(包括大语言模型)的训练通常要经过以下基本流程

  1. 准备数据:收集并整理训练数据集。对于监督学习,需要包含输入及其对应的期望输出(标签)。数据通常要经过清洗和预处理,例如统一格式、处理缺失值、分词(对文本)或归一化数值等。充足且高质量的数据是训练出好模型的前提。
  2. 定义模型:选择模型架构并初始化参数。对于深度神经网络,这涉及确定网络层数、每层的大小以及连接方式等(例如选择使用Transformer结构,并决定使用多少层编码器/解码器、每层的隐藏单元维度、注意力头数量等)。初始化参数通常为随机小值或根据某种分布,以打破对称性。
  3. 正向传播 (Forward Pass):将训练数据输入模型,计算模型的预测输出。对于神经网络,这意味着逐层计算,从输入层经过隐藏层直到输出层。例如,对一个样本,Transformer 模型会经过嵌入、注意力计算、前馈网络等一系列运算得到最终的预测结果。
  4. 计算损失:将模型的预测结果与真实标签进行比较,使用预先选定的损失函数计算误差值。例如,对于分类任务计算交叉熵损失,对于回归任务计算均方误差。损失值表示当前模型预测的不准确程度:值越大表示预测偏离真实越多。
  5. 反向传播与参数更新 (Backward Pass & Update):根据损失值,使用反向传播算法计算损失对模型各参数的梯度。然后利用优化算法(如梯度下降或Adam等)按照梯度的方向调整参数值,以期减小下次预测的损失。这个过程通常以一定的学习率(step size)进行,避免每次更新过大或过小。
  6. 迭代训练:重复步骤3-5,对数据集中每个样本(或批次)进行前向计算和反向更新。完整遍历一遍训练集称为一个epoch。通常需要训练多轮(epoch)直到模型在训练集上的损失收敛到较低水平。训练过程中通常会在验证集上监控模型表现,以防止过拟合。
  7. 模型评估与部署:在独立的测试集上评估模型的性能,确保模型泛化良好没有过拟合。在满意后,将模型部署到实际环境中使用。例如,将训练好的语言模型用于下游应用(聊天机器人、机器翻译服务等)。

以上流程描述了训练一个模型的大致过程。然而,在实际训练深度学习模型、尤其是大规模模型时,会遇到诸多挑战

  • 数据和计算资源:深度学习是数据驱动的,大模型通常需要海量的数据才能充分训练。而处理如此多数据需要巨大的计算资源支持。比如,GPT-3训练使用了上百亿词的文本和数千GPU集群,训练一次耗费数百万美元。这对一般个人或小型团队是不可承受的。即使模型训练完成,在推理阶段也需要昂贵的GPU/TPU来运行模型。这使得大模型的研究和应用成本高昂。
  • 训练时间长:由于参数规模大、数据量大,训练大模型可能需要持续数天、数周甚至更长时间。这带来了一系列工程问题,比如需要良好的分布式训练策略,将计算负载分散到多卡多机;需要容错和断点续训机制,以防中途中断浪费计算;同时长时间训练也增加了调试难度。
  • 模型收敛和稳定性:深层神经网络容易在训练中遇到不稳定,比如梯度消失/爆炸、不收敛甚至损失Nan等问题。虽然像残差连接、正确的初始化和归一化技巧有所帮助,但对于超大模型,找到合适的超参数(学习率、批次大小、正则化强度等)依然充满挑战。此外,大模型有时出现梯度异常敏感,需要精细调整学习率调度策略(如预热、余弦退火等)才能顺利收敛。
  • 过拟合与泛化:模型参数越多,记忆训练集细节的能力越强,因而过拟合风险越高。为了提高泛化表现,需要采取措施避免模型仅“死记硬背”训练集。例如使用正则化技术(如 dropout、权重衰减),或者在训练时引入数据增强来增加数据多样性。另外,常以验证集性能为依据来提前停止训练(early stopping)或者选取最佳模型。在大模型训练中,过拟合仍然是潜在隐患,需要仔细监控模型在未见数据上的性能。
  • 调试和可解释性:大模型内部复杂且难以解释,训练过程中如果出现问题(比如损失突然爆炸),往往难以直接定位原因。相比小模型,可以通过可视化权重或手工检查特征来理解模型,大模型更多时候是个“黑箱”。如何解释模型的决策、监控中间层的行为,是深度学习领域长期存在的问题。近期也有通过可视化注意力权重等方法来部分解释 Transformer 判别依据,但整体而言解释性仍有限。

总的来说,训练大模型既是一门科学,也是一门工程艺术。需要既懂模型原理又具备工程实践能力,方能在保证模型性能的同时控制资源消耗风险。后续章节我们将进一步探讨应对这些挑战的方法,比如更高效的模型架构、训练技巧,以及通过引入外部知识(如 RAG 框架)来减轻纯参数模型的负担。

8. 参数规模对模型性能的影响

深度学习一个直观的经验是:更大的模型往往有更强的性能。参数规模增加意味着模型拥有更多的自由度来拟合复杂模式。在自然语言处理中,大模型展示了许多小模型无法企及的能力。例如,BERT 最初有 base(1.1亿参数)和 large(3.4亿参数)两个版本,后者在各项NLP基准上明显优于前者 。GPT-3 拥有 1750亿 参数,远超其前代 GPT-2 的 15亿参数规模,正是这种规模上的飞跃带来了 GPT-3 在零样本/少样本学习能力上的质变 。模型容量大,意味着其可以储存更丰富的模式和知识,从而在语言生成、问题回答等任务上给出更接近人类水平的输出。

随着参数数量呈指数级增长,模型性能常常按近似对数的速度提升。这在学界被总结为“缩放定律”(Scaling Laws):模型性能的提升大致遵循参数量、数据量和计算量的幂指数关系。在合理范围内,更多的参数配合更多训练数据,通常会带来更好的结果。然而,这种提升并非没有限制和代价:

  • 收益看,大模型能够涌现一些小模型没有的新能力,被称为涌现能力。如 GPT-3 展示的少样本学习、理解复杂指令等,在小模型上很难观察到。这使得研究者对大模型抱有兴趣,希望通过扩大规模挖掘出AI更多潜在能力。
  • 代价看,参数翻倍所需的计算资源和训练数据也成倍甚至更高速增长,而且性能提升往往有边际递减效应。当模型增大到一定程度,若训练数据跟不上,可能出现大模型数据不足的问题,甚至导致过拟合或参数利用不充分。此外,部署推理大模型成本高、速度慢:如需要更显存的GPU、多机分布式推理,以及在低资源设备(如手机)上难以运行等。
  • 模型瓶颈:仅靠增加参数也并非万能。例如,语言模型的上下文长度有限制,超过一定长度外的信息无论模型多大也看不到;再如模型本身架构若存在偏差(比如训练目标与应用目标不完全一致),光靠堆砌参数也无法弥补。这促使研究者思考更聪明的扩展方式,比如 Mixture-of-Experts(专家混合)架构,通过引入条件计算,让一部分参数在每次推理中激活,从而以相对少的计算实现“虚拟”的巨大模型容量。

总而言之,参数规模对模型性能具有显著影响,大体上“越大越好”,但也存在成本和效率上的权衡。当今业界在探索两条路线:一是继续提升参数量并配以优化的训练策略,二是通过新颖架构和算法在较少参数下挖掘更高性能。RAG(检索增强生成)实际上属于第二种思路:它通过引入外部知识库,在不盲目增加模型参数的情况下提升模型的知识获取能力和准确性。这在下一节会详细讨论。

9. 什么是 RAG(检索增强生成),为何提出这一框架

随着大模型的应用愈发广泛,人们发现仅靠增加参数,模型仍然存在知识更新和事实准确性方面的不足。典型问题如:模型的训练语料有时会滞后于现实,导致模型对新近发生的事实问题回答错误;又或者模型可能“臆测”出训练数据中没有的知识,给出不真实的答案。RAG(Retrieval-Augmented Generation,检索增强生成)正是为了解决这类问题而提出的一种框架。RAG 将信息检索文本生成结合,使得模型可以在生成回答前动态获取外部知识

在传统纯生成模型中,LLM 接收用户输入后,只能依据其训练期间内隐储存的知识来产生回答。如果用户问到超出模型训练范围的问题,模型要么无法作答,要么可能编造(即出现“幻觉”)。而引入 RAG 后,流程变为:模型先根据用户的问题去查询一个外部知识库(可以是维基百科、公司文档、数据库等),找出相关资料,然后将这些资料与问题一起送入生成模型,以此作为辅助来产生回答。因为有了真实资料的支撑,模型回答的可靠性和准确性都会提高。例如,如果问模型“2024年奥运会举办地在哪里?”,一个纯LLM若训练数据截止于2021年可能不知道,而采用RAG框架的模型会先检索到相关新闻/维基百科内容,然后回答:“2024年奥运会将在法国巴黎举办。”

概括来说,RAG是一种让模型学会“先查再答”的策略。它的重要意义包括:

  • 知识更新性:通过检索最新的资料,模型不再局限于训练语料,能够回答训练后发生的新知识、新事实问题。例如,实时新闻问答、最新法规查询等场景下RAG特别有效 。
  • 减少幻觉:模型有了外部文档依据,回答更有据可依,减少了凭空编造的情况 。尤其在医疗、金融等需要高准确率的领域,让模型引用权威资料能够极大提升可信度和专业性。
  • 降低记忆负担:模型不需要将所有知识都固化在参数中。对于海量细节信息,通过检索获取可以减少模型参数需求,从而用较小模型实现类似大模型的性能。这对资源有限的应用非常有价值。

RAG 框架的提出,初衷正是为了扬长避短:让生成模型继续发挥其语言表达优势,同时用检索来弥补其知识广度和时效性的不足。在实践中,RAG 已成为知识问答、对话系统等应用中备受关注的方法,为大模型拓展实时和专业知识提供了一条切实可行的路径。

10. RAG 的基本工作流程(索引-检索-融合-生成)

RAG 系统通常由两个主要部分组成:检索模块生成模块。在实际应用中,其工作流程可以分为以下几个步骤:

  1. 索引 (Index):首先,对外部知识库进行预处理和建立索引。知识库可以是文本文档集合、问答对数据库、网页等。索引过程包括将文档进行分段、向量化表示(例如通过嵌入模型将每段文字转换为向量)等操作,构建一个便于快速相似查询的索引结构。简单来说,就是提前把知识库“整理打包”,以便后续高效检索。
  2. 检索 (Retrieve):当用户提出查询时,系统利用上述索引从知识库中检索出与查询内容相关的文本片段。这个过程类似于搜索引擎:可以基于关键词匹配或语义向量相似度来查找。输出是若干条与查询可能有关的候选内容(例如最相关的几段文字)。检索模块的效果直接影响最终答案的质量——需要既相关可靠的信息。
  3. 融合 (Fuse):将检索得到的外部信息与原始查询进行结合,作为生成模型的输入。有几种融合方式:一种简单方式是把查询和检索结果文本直接拼接成提示(prompt),例如“用户问题 + [文档1] + [文档2] + …”,然后交给生成模型;另一种方式是有专门的神经网络将查询和文档做进一步交互融合(如通过交叉注意力机制整合)。无论方式如何,此步骤的目的是让生成模型同时看到问题参考资料,从而在回答时能够引用资料内容。
  4. 生成 (Generate):最后,由生成模块(通常是一个大型语言模型,例如GPT类模型)基于融合后的输入,生成回答文本。因为模型获取了相关知识片段,它可以有的放矢地组织语言来回答问题,并尽量确保内容准确。生成时模型可能还会平衡回答的流畅性、连贯性,以及对检索内容的引用。输出即为给用户的最终答案。

以上过程可以理解为“先索引,后检索,结合信息再生成”。下图用流程图展示了 RAG 系统从知识库到答案的大致流动:

mermaid
flowchart TB
    kb[知识库] --> indexing[索引(建立索引)]
    indexing -. 将索引提供给 .-> retriever[检索(查询相关文档)]
    query[用户查询] --> retriever
    retriever -- 返回相关文档 --> fusion[融合(结合查询和文档)]
    fusion --> generator[生成(LLM生成答案)]
    generator --> answer[最终答案]

图中,离线阶段先对知识库建立索引结构,在线查询时利用索引快速检索出相关文档,与用户的问题一同送入生成模型,生成最终答案。例如,用户问一个关于历史的问题,检索模块从百科文章中找到了相关段落,融合阶段将问题和段落一并交给GPT模型,模型据此产出含引文依据的回答。

需要注意,RAG 的实现有多种变体。一些实现让生成模型在解码过程中可以动态地多次检索,不局限于一次(即迭代式检索);另一些实现注重检索内容与模型内部知识的融合深度,比如在Transformer中引入专门的交叉注意力层去读外部文档。不过,不管具体方法如何变化,上述四步流程基本代表了RAG思想的主干。

11. RAG 的优势与挑战

引入检索增强生成策略,为大模型应用带来了许多优势,同时也提出了一些新的挑战

优势:

  • 提高事实准确性:RAG让模型的回答有据可依。通过检索权威来源,模型生成内容时可引用事实依据,显著降低了无根据瞎猜的情况 。这在要求精准回答的场景(医疗、法律等)中特别重要,增强了用户对AI回答的可信任度
  • 获取最新信息:由于可以访问外部知识库,RAG 系统能够提供最新的答案。即便模型训练时不知道的信息(比如最近发生的事件),也可通过检索最新资料并反馈给模型,从而生成与当前事实一致的回答 。模型不再局限于训练语料年代,大大拓展了适用范围。
  • 领域定制能力:传统模型要适应特定专业领域,往往需要领域数据上重新训练或微调。而RAG只需维护一个领域知识库即可。对于垂直领域的问答,检索模块可定向从专业文档中提取信息,生成模块不需要完全学会专业知识也能给出正确回答 。这意味着小模型+大知识库的组合即可胜任许多专业任务,降低了定制成本。
  • 模型可解释性:相比纯生成模型,RAG 的决策路径更透明。因为最终答案源于模型对检索文档的综合,用户或开发者可以追溯模型引用了哪些资料。这提供了一定程度的可解释性:我们可以检查检索到的内容来评估答案可靠性,甚至将这些内容直接呈现给用户以增强说服力(如“根据某某文献…”)。
  • 成本效益:RAG 在某种程度上以空间换时间、以计算换参数。通过借助外部存储的大量知识,模型本身不需要无限制扩张参数量。这带来的好处是:在相同性能需求下,RAG 方案所需的模型规模可以更小,因而训练和推理成本更低。同时,更新知识变得更简单——只需更新知识库,而无须频繁地用新数据去完全重新训练模型。这对于实际部署来说更加经济高效 。

挑战:

  • 依赖知识库质量:RAG 的回答质量很大程度上取决于检索到的外部数据。如果知识库内容不正确或有偏差,模型可能被“带偏”输出错误结论 。因此,维护一个高质量、无偏的知识库非常关键。这涉及内容的审核、更新和过滤,需要投入额外的人力物力。
  • 系统复杂度增加:相比一个端到端的大模型,RAG 把流程拆成检索和生成两部分,整体系统更复杂。检索模块本身需要调试优化(如设置索引参数、平衡检索精度与速度),生成模块也要与检索结果配合良好 。各组件都有可能成为短板,增加了工程上的维护成本。例如,需要定期重新索引文档,调整检索算法;如果更换生成模型或检索模型,还要确保新组件兼容。
  • 响应延迟:RAG 在生成回答前多了一个检索步骤,因此响应时间往往比纯LLM要长 。尽管一次检索几百毫秒听起来不多,但在某些实时交互场景(客服对话、实时助手)中,这种延迟可能影响用户体验。此外,如果检索得到大量文档,融合和生成过程也会更耗时。如何优化检索速度、减少不必要的文档传递,是RAG应用需要考虑的问题。
  • 融合与上下文长度限制:将检索到的资料提供给模型,有时会受到模型上下文长度的限制(大多数语言模型都有最大输入长度)。如果相关资料很多或内容长,模型未必能一次看完,这就需要选择融合策略:要么截断部分信息,要么分段多次提问。此外,模型如何有效地利用检索信息也是挑战之一——有时候模型可能忽视检索内容、依然依赖自身参数知识作答,从而丧失RAG的意义。为此,可能需要在提示中明确要求模型参考文档,或在模型架构上强化对外部信息的依赖。
  • 潜在的安全与隐私问题:RAG系统可能接入内部专有知识库或在线搜索,这引入了数据安全和隐私方面的考虑。如果知识库包含敏感信息,检索与生成过程中需要防止数据泄露。此外,让模型接入互联网检索也要防范恶意内容的干扰(例如检索结果被注入不良信息影响模型输出)。因此,在构建RAG应用时,权限控制内容过滤等安全措施也不可或缺。

总的来说,RAG 为提升大模型实用性提供了有力工具,但实现一个高效可靠的RAG系统需要权衡多方面因素。当前业界在积极探索最佳实践,例如如何构建更智能的检索器、如何让生成模型更好地消化外部知识,以及如何在保持性能的同时简化系统架构。在不断的迭代中,RAG 的优势将得到更充分发挥,而挑战也会逐步被克服。